home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
4_0
/
ORBMECHD
/
HOHMANN.C
< prev
next >
Wrap
Text File
|
1991-02-25
|
7KB
|
286 lines
/********************************
Hohmann Transfer algorithm.
8 August 1990
********************************/
#include "orbmech.h"
#include "SANE.h"
#include "math.h"
#define HOHMANNREC_SIZE 80
/* globals */
extern DialogPtr LambertDia, HohmannDia, HillsDia, KeplerDia, whichDialog, gHelpDia;
extern EventRecord gEvent;
extern TEHandle TEH;
extern decform gdecform;
extern int dirty;
struct ParamRec
{
extended value;
Str255 name;
};
extern struct ParamRec gParameter;
struct HohmannRec
{
extended rad_one, rad_two, flight_time;
extended delta_v_initial, delta_v_final, delta_v_total;
extended wedge, d_i_initial;
} ;
typedef struct HohmannRec *HohmannPtr;
/***********************************/
Hohmann()
{
Handle inputH, itemHandle;
Str255 r1Str, r2Str, dviStr, dvfStr, dvtStr, ftStr;
Str255 wedgeStr, diiStr;
int itemType;
Rect itemRect;
Boolean dont_panic = 1, miFlag = 0, auFlag = 0, degFlag;
decimal result;
ControlHandle kmSecBut, miHrBut, radBut;
struct HohmannRec *Hdata;
Ptr temp;
Str255 q, w, e, r, y, u, p, j, k, l, f, t;
temp = NewPtr( HOHMANNREC_SIZE );
Hdata = ( HohmannPtr) temp;
pStrCopy("\p\rHohmann Transfer ", q);
pStrCopy("\p\r radius 1: ", w);
pStrCopy("\p\r radius 2: ", e);
pStrCopy("\p\r wedge angle: ", f);
pStrCopy("\p\r primary: ", y);
pStrCopy("\p\r\rTransfer orbit Delta-V required ", u);
pStrCopy("\p\r initial: ", j);
pStrCopy("\p\r final: ", k);
pStrCopy("\p\r total: ", l);
pStrCopy("\p\r\rFlight time: ", r);
pStrCopy("\p\r\rInitial plane change: ", t);
pStrCopy("\p\r\r", p);
GetDItem( HohmannDia, RAD_ONE, &itemType, &inputH, &itemRect);
GetIText( inputH, &r1Str );
Pstr_to_extended( &r1Str, &Hdata->rad_one, &dont_panic );
GetDItem( HohmannDia, RAD_TWO, &itemType, &inputH, &itemRect);
GetIText( inputH, &r2Str );
Pstr_to_extended( &r2Str, &Hdata->rad_two, &dont_panic );
GetDItem( HohmannDia, WEDGE, &itemType, &inputH, &itemRect);
GetIText( inputH, &wedgeStr );
Pstr_to_extended( &wedgeStr, &Hdata->wedge, &dont_panic );
GetDItem ( HohmannDia, KM_SEC_O, &itemType, &kmSecBut, &itemRect);
GetDItem ( HohmannDia, MI_HR_O, &itemType, &miHrBut, &itemRect);
GetDItem ( HohmannDia, RAD_BUT2, &itemType, &radBut, &itemRect);
if ( dont_panic )
{
if ( ! GetCtlValue ( kmSecBut ) )
if ( GetCtlValue ( miHrBut ) ) {
Hdata->rad_one *= MI_CONV;
Hdata->rad_two *= MI_CONV;
miFlag = 1;
}
else {
Hdata->rad_one *= AU_CONV;
Hdata->rad_two *= AU_CONV;
auFlag = 1;
}
if ( ! GetCtlValue ( radBut ) ) {
Hdata->wedge /= DEG_CONV;
degFlag = 1;
}
TEInsert( q+1, *q, TEH );
TEInsert( w+1, *w, TEH );
TEInsert( r1Str+1, *r1Str, TEH );
TEInsert( e+1, *e, TEH );
TEInsert( r2Str+1, *r2Str, TEH );
TEInsert( f+1, *f, TEH );
TEInsert( wedgeStr+1, *wedgeStr, TEH );
TEInsert( y+1, *y, TEH );
TEInsert( gParameter.name+1, *gParameter.name, TEH );
calcuateHohmann( Hdata );
if ( miFlag ) {
Hdata->delta_v_initial /= MI_CONV / HR_CONV;
Hdata->delta_v_final /= MI_CONV / HR_CONV;
Hdata->delta_v_total /= MI_CONV / HR_CONV;
Hdata->flight_time /= HR_CONV;
}
if ( auFlag ) {
Hdata->delta_v_initial /= AU_CONV / YR_CONV;
Hdata->delta_v_final /= AU_CONV / YR_CONV;
Hdata->delta_v_total /= AU_CONV / YR_CONV;
Hdata->flight_time /= YR_CONV;
}
if ( Hdata->delta_v_initial > 9999.0 || Hdata->delta_v_initial < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, Hdata->delta_v_initial, &result );
dec2str( &gdecform, &result, dviStr );
if ( Hdata->delta_v_final > 9999.0 || Hdata->delta_v_final < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, Hdata->delta_v_final, &result );
dec2str( &gdecform, &result, dvfStr );
if ( Hdata->delta_v_total > 9999.0 || Hdata->delta_v_total < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, Hdata->delta_v_total, &result );
dec2str( &gdecform, &result, dvtStr );
if ( Hdata->flight_time > 9999.0 || Hdata->flight_time < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, Hdata->flight_time, &result );
dec2str( &gdecform, &result, ftStr );
if ( degFlag )
Hdata->d_i_initial *= DEG_CONV;
if ( Hdata->d_i_initial > 9999.0 || Hdata->d_i_initial < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, Hdata->d_i_initial, &result );
dec2str( &gdecform, &result, diiStr );
TEInsert( u+1, *u, TEH );
TEInsert( j+1, *j, TEH );
TEInsert( dviStr+1, *dviStr, TEH );
TEInsert( k+1, *k, TEH );
TEInsert( dvfStr+1, *dvfStr, TEH );
TEInsert( l+1, *l, TEH );
TEInsert( dvtStr+1, *dvtStr, TEH );
TEInsert( r+1, *r, TEH );
TEInsert( ftStr+1, *ftStr, TEH );
TEInsert( t+1, *t, TEH );
TEInsert( diiStr+1, *diiStr, TEH );
TEInsert( p+1, *p, TEH );
dirty = 1;
GetDItem( HohmannDia, D_V_I, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dviStr );
GetDItem( HohmannDia, D_V_F, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvfStr );
GetDItem( HohmannDia, D_V_T, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvtStr );
GetDItem( HohmannDia, FLT_T, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, ftStr );
GetDItem( HohmannDia, D_I_INITIAL, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, diiStr );
ShowSelect();
}
}
extended deltaV( va, vb, w )
extended va, vb, w;
{
extended value;
value = sqrt( va*va + vb*vb - 2.0 * va * vb * cos( w ) );
return( value );
}
calcuateHohmann( Hdata )
struct HohmannRec *Hdata;
{
extended guess, dit, dvg, var, dvl, dvh;
Boolean converged;
extended r1, r2, mu, v1, v2, vp, va, a;
extended deltaV();
r1 = Hdata->rad_one;
r2 = Hdata->rad_two;
dit = Hdata->wedge;
a = ( r1 + r2 ) / 2;
mu = gParameter.value;
v1 = sqrt( mu / r1 );
v2 = sqrt( mu / r2 );
vp = sqrt( mu * r2 / a / r1 );
va = sqrt( mu * r1 / a / r2 );
guess = dit / 8.0;
var = START_VAR;
converged = 0;
while ( ! converged ) {
dvg = deltaV( v1, vp, guess ) + deltaV( v2, va, (dit-guess) );
dvl = deltaV( v1, vp, (guess-var) ) + deltaV( v2, va, (dit-guess+var) );
dvh = deltaV( v1, vp, (guess+var) ) + deltaV( v2, va, (dit-guess-var) );
if ( dvg > dvh )
guess += var;
else if ( dvg > dvl )
guess -= var;
else
var /= 2.0;
if ( var < .000001 )
converged = 1;
}
Hdata->delta_v_initial = deltaV( v1, vp, guess );
Hdata->delta_v_final = deltaV( v2, va, (dit-guess) );
Hdata->delta_v_total = Hdata->delta_v_initial + Hdata->delta_v_final;
Hdata->flight_time = sqrt( a * a * a / mu ) * PI_VALUE;
Hdata->d_i_initial = guess;
}